According to its JavaDocs, the intermediate Stream operation java.util.Stream.peek()
“exists mainly to support debugging”
purposes.
A key difference with other intermediate Stream operations is that the Stream implementation is free to skip calls to peek()
for
optimization purpose. This can lead to peek()
being unexpectedly called only for some or none of the elements in the Stream.
As a consequence, relying on peek()
without careful consideration can lead to error-prone code.
This rule raises an issue for each use of peek() to be sure that it is challenged and validated by the team to be meant for production
debugging/logging purposes.
Noncompliant code example
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.peek(e -> System.out.println("Filtered value: " + e)); // Noncompliant
Compliant solution
Stream.of("one", "two", "three", "four")
.filter(e -> e.length() > 3)
.foreach(e -> System.out.println("Filtered value: " + e));